package com.own.component.elastic.core.base.hook;

import co.elastic.clients.elasticsearch._types.mapping.Property;
import com.own.component.elastic.core.base.ElasticFieldHandlerEnum;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.util.List;

/**
 * BaseElasticFieldHandler
 *
 * @author chenxueli
 * @date 2024-03-11 14:06:00
 */
public abstract class BaseElasticFieldHandler<T extends Annotation> {

    private final Class<T> annotationClass;

    @SuppressWarnings("unchecked")
    public BaseElasticFieldHandler() {
        var array = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments();
        annotationClass = array.length == 1 ? (Class<T>) array[0] : null;
    }

    /**
     * 处理
     *
     * @param annotation 注解
     * @param field      字段信息
     * @return 属性
     */
    public abstract Property accept(T annotation, Field field);

    /**
     * 操作的名称
     *
     * @return 名称
     */
    public abstract ElasticFieldHandlerEnum handler();

    /**
     * 处理
     *
     * @param annotation 注解
     * @param field      字段信息
     * @return 属性
     */
    public final Property handle(Annotation annotation, Field field) {
        return accept(annotationClass.cast(annotation), field);
    }

    /**
     * 解析的字段类型
     *
     * @return 类型
     */
    public final List<Class<?>> clazzList() {
        return handler().clazzList();
    }

    /**
     * 操作的名称
     *
     * @return 名称
     */
    public final String key() {
        return handler().name();
    }

    /**
     * 注解当前解析的类型
     *
     * @return 注解
     */
    public final Class<T> annotation() {
        return annotationClass;
    }

}
